
/**
 * 普通攻击计算 普攻计算:普通攻击计算(编号,伤害比,友伤,战斗数据)
 * @param {*} fight_data 
 * @param {*} src_unit 
 * @param {*} damage_ratio  伤害比
 * @param {*} firent_damage  友伤
 */
export function computing_normal_attack(fight_data, src_unit, damage_ratio, firent_damage = false) {
	console.debug(`普通攻击计算 ===> fight_unit : ${src_unit["编号"]} damage_ratio: ${damage_ratio} 友伤: ${firent_damage}`);
	if (src_unit["指令"]["取消"]) {
		console.debug(`普通攻击计算 ===> 指令取消`);
		return false;
	}
	let target_number = src_unit["指令"]["目标"];
	let target_unit = G.FightUtils.get_fight_unit_by_number(fight_data, target_number);

	if (G.FightUnitUtils.check_fight_unit_jingmai(src_unit, "花果山", "顽心")) {
		src_unit["顽心"] = 1;
	}
	if (!firent_damage) {
		// 如果目标已经不可操作则更换目标
		if (target_unit === undefined) {
			target_unit = G.FightUtils.get_enemy_team_single_survive_unit(fight_data, src_unit);
			src_unit["指令"]["目标"] = target_unit["编号"];
			console.debug(`普通攻击计算 ===> 目标单位不存在 重新寻找目标单位：${target_unit !== undefined}`);
		} else if (!G.FightUnitUtils.get_target_unit_status(src_unit, target_unit, 1)) {
			target_unit = G.FightUtils.get_enemy_team_single_survive_unit(fight_data, src_unit);
			console.debug(`普通攻击计算 ===> 目标单位无法选中 重新寻找目标单位：${target_unit !== undefined}`);
			if (target_unit !== undefined) {
				src_unit["指令"]["目标"] = target_unit["编号"];
			}
		}
		if (target_unit === undefined) {
			console.debug(`普通攻击计算 ===> 仍然找不到目标单位，跳过`);
			return false;
		}
	}

	if (target_unit["法术状态"] && target_unit["法术状态"]["分身术"] && target_unit["法术状态"]["分身术"]["破解"] === undefined) {
		target_unit["法术状态"]["分身术"]["破解"] = 1;
		console.debug(`普通攻击计算 ===> 分身术破解，跳过`);
		return false;
	}

	if (src_unit["从天而降"] && G.RandomUtils.chance(10)) {
		if (src_unit["模型"] === "超级神鸡" || src_unit["模型"] === "进阶超级神鸡") {
			fight_data["战斗流程"].push({ "流程": 120, "攻击方": src_unit["编号"] });
		} else {
			fight_data["战斗流程"].push({
				"流程": 1,
				"攻击方": src_unit["编号"],
				"被攻击": [{ "编号": target_unit["编号"], "特效": [] }],
				"假动作": true,
				"返回": true,
			});
		}
		console.debug(`普通攻击计算 ===> 从天而降，跳过`);
		return false;
	}

	fight_data["战斗流程"].push({
		"流程": 1,
		"攻击方": src_unit["编号"],
		"被攻击": [{ "编号": target_unit["编号"], "特效": [] }],
	});

	//躲避
	let db = false;
	//附加躲避
	let fjdb = 0
	//附加命中
	let fjmz = 0

	if (target_unit["法术状态"] && target_unit["法术状态"]["舞雪冰蝶"]) {
		fjdb = 30;
	} else if (target_unit["躲避减少"]) {
		fjdb = target_unit["躲避减少"];
	}
	if (src_unit["内丹属性"]["撞击"]) {
		fjmz += src_unit["内丹属性"]["撞击"];
	}

	if (src_unit["断线木偶"]) {
		db = true;
	} else if (!src_unit["必中"] && G.RandomUtils.chance(fjdb)) {
		db = true;
	}
	if (db) {
		fight_data["战斗流程"][fight_data["战斗流程"].length - 1]["躲避"] = true;
		fight_data["战斗流程"][fight_data["战斗流程"].length - 1]["返回"] = true;
		return true;
	}

	let fy = false;

	// 伤害
	let damage = G.FightPhysicalAttack.get_ad_damage(fight_data, src_unit, target_unit) * damage_ratio;

	// 最终伤害
	let final_damage = G.FightPhysicalAttack.get_final_ad_damage(fight_data, src_unit, target_unit, damage, 0, 2);

	let bh = false;

	let bh_unit;

	if (target_unit["类型"] === "角色" && target_unit["气血"] < target_unit["最大气血"] * 0.5
		&& final_damage["伤害"] * 0.3 < target_unit["气血"] && final_damage["伤害"] > target_unit["最大气血"] * 0.1
		&& G.RandomUtils.chance(70)) {
		let number_list = [];
		fight_data["队伍数据"].forEach(team => {
			if (team[0]["队伍"] === target_unit["队伍"]) {
				team.forEach(unit => {
					if (G.FightUnitUtils.get_unit_process_status(fight_data, unit) && target_unit["法术状态"]["惊魂掌"] === undefined
						&& unit["类型"] === "角色" && unit["编号"] !== target_unit["编号"]) {
						number_list.push(unit);
					}
				});
			}
		});
		if (number_list.length >= 1) {
			bh_unit = G.RandomUtils.random_get_array(number_list);
			bh = true;
		}
	} else {
		fight_data["队伍数据"].forEach(team => {
			if (team[0]["队伍"] === target_unit["队伍"]) {
				team.forEach(unit => {
					if (G.FightUnitUtils.get_unit_process_status(fight_data, unit) && target_unit["法术状态"]["惊魂掌"] === undefined
						&& unit["指令"] && unit["指令"]["类型"] === "保护" && unit["指令"]["目标"] === target_unit["编号"]
						&& unit["编号"] !== target_unit["编号"] && !firent_damage) {
						bh_unit = unit;
						bh = true;
						unit["指令"]["类型"] = "";
					}
				});
			}
		});
	}
	console.debug(`普通攻击计算 ===> 保护：${bh}`);
	console.debug(`普通攻击计算 ===> 保护单位是否存在：${bh_unit !== undefined}`);

	if (target_unit["指令"] && target_unit["指令"]["类型"] === "防御" && G.FightUnitUtils.get_unit_process_status(fight_data, target_unit)
		&& G.FightUnitUtils.get_unit_defence_status(target_unit)) {
		final_damage["伤害"] = final_damage["伤害"] * 0.5;
		final_damage["动作"] = "防御";
		fy = true;
		if (target_unit["点石成金"]) {
			final_damage["伤害"] = final_damage["伤害"] * target_unit["点石成金"];
		}
		if (G.FightUnitUtils.check_fight_unit_jingmai(target_unit, "击破")) {
			final_damage["伤害"] = final_damage["伤害"] * 1.5;
		}
		if (target_unit["法术状态"] && target_unit["法术状态"]["愈勇"]) {
			G.FightStatusUtils.canel_unit_status(fight_data, "愈勇", target_unit);
		}
	}

	//友伤
	if (firent_damage) {
		if (target_unit["法术状态"] && target_unit["法术状态"]["催眠符"]) {
			final_damage["伤害"] = 1;
		}
		fight_data["战斗流程"][fight_data["战斗流程"].length - 1]["友伤"] = true;
	}

	let damage_result = G.FightComputingUtils.get_damage_result(fight_data, src_unit, target_unit, final_damage["伤害"], final_damage["暴击"], null, bh, fy, 1);

	if (src_unit["门派"] === "盘丝洞") {
		if (G.FightUnitUtils.check_fight_unit_jingmai(src_unit, "盘丝洞", "罗网")) {
			damage_result["伤害"] = damage_result["伤害"] * 1.1;
			if (G.RandomUtils.chance(70)) {
				G.FightStatusUtils.add_unit_status(fight_data, src_unit, target_unit, "天罗地网", G.FightUnitUtils.get_unit_skill_level(src_unit, "天罗地网"));
			}
		}
	} else if (src_unit["从天而降"]) {
		damage_result["伤害"] = damage_result["伤害"] * 1.5;
	} else if (G.RandomUtils.chance(src_unit["超级必杀"])) {
		damage_result["伤害"] = damage_result["伤害"] * G.RandomUtils.generate_random(2, 3);
	} else if (target_unit["超级招架"] && target_unit["统计数据"]["被伤统计"]["物理"] === 0) {
		damage_result["伤害"] = damage_result["伤害"] * 0.8;
	}

	if (bh) {
		let x1 = 0.7;
		let x2 = 0.3;
		if (src_unit["势如破竹"]) {
			x1 = 0.4;
			x2 = 0.6;
		}
		let bh_damage = Math.floor(damage_result["伤害"] * (x1));
		if (bh_damage < 1) { bh_damage = 1 }

		let bh_die = G.FightComputingUtils.computing_remove_hp(fight_data, src_unit, bh_unit, bh_damage)
		console.debug(`computing_remove_hp bh_die : ${bh_die}`)

		damage_result["伤害"] = Math.floor(damage_result["伤害"] * (x2));
		if (G.FightUnitUtils.check_fight_unit_jingmai(target_unit, "大唐官府", "破空")) {
			damage_result["伤害"] = Math.floor(damage_result["伤害"] * 1.1);
		}
		if (bh_damage < 1) { bh_damage = 1; }
		fight_data["战斗流程"][fight_data["战斗流程"].length - 1]["保护数据"] = { "编号": bh_unit["编号"], "伤害": bh_damage, "死亡": bh_die };
	}

	if (src_unit["法术状态"]["落魄符"] || src_unit["法术状态"]["错乱"] || src_unit["法术状态"]["发瘟匣"] || src_unit["法术状态"]["无魂傀儡"]) {
		if (G.RandomUtils.chance(70)) {
			damage_result["伤害"] = 1;
		}
	}

	damage_result["伤害"] = Math.floor(damage_result["伤害"]);
	if (damage_result["伤害"] < 1) {
		damage_result["伤害"] = 1;
	}

	if (target_unit["共生"]) {
		G.FightPhysicalAttack.computing_physical_damage_gs(fight_data, src_unit, target_unit, damage_result["伤害"] + 1, final_damage["动作"], damage_result["特效"], true);
		return true;
	}

	if (damage_result["类型"] === 2) { //恢复状态
		G.FightComputingUtils.add_target_hp_and_play(fight_data, target_unit, damage_result["伤害"]);
	} else {
		let die = G.FightComputingUtils.computing_remove_hp(fight_data, src_unit, target_unit, damage_result["伤害"], "普通攻击", firent_damage);
		fight_data["战斗流程"][fight_data["战斗流程"].length - 1]["被攻击"][0]["死亡"] = die;
		G.FightUtils.add_waiting_play_time(fight_data, 1, "普通攻击");
		//火甲术反击
		if (target_unit["法术状态"]["火甲术"]) {
			G.FightAPSkillUtils.computing_ap_skill(fight_data, target_unit, src_unit, "三昧真火", target_unit["等级"], 0.5);
		}
	}
	fight_data["战斗流程"][fight_data["战斗流程"].length - 1]["被攻击"][0]["动作"] = final_damage["动作"];
	if (damage_result["特效"].length === 0) {
		fight_data["战斗流程"][fight_data["战斗流程"].length - 1]["被攻击"][0]["特效"] = ["被击中"];
	} else {
		fight_data["战斗流程"][fight_data["战斗流程"].length - 1]["被攻击"][0]["特效"] = damage_result["特效"];
	}
	let xx = src_unit["吸血"];
	if (xx && src_unit["法术状态"]["移魂化骨"]) {
		xx = src_unit["法术状态"]["移魂化骨"]["吸血"];
	}
	if (xx && !target_unit["特殊状态"]["鬼魂术"]) {
		let xx_damage = Math.floor(damage_result["伤害"] * xx);
		if (xx_damage < 1) {
			xx_damage = 1;
		}
		// 异常吸血
		let ycsh = Math.floor(src_unit["气血"] + xx_damage - src_unit["最大气血"]) / 2;
		G.FightComputingUtils.add_target_hp_and_play(fight_data, src_unit, Math.floor(xx_damage))
		fight_data["战斗流程"][fight_data["战斗流程"].length - 1]["吸血伤害"] = Math.floor(xx_damage);
		if (xx < 0.3 && src_unit["法术状态"]["毒"] && G.FightUnitUtils.get_error_xx_status(target_unit).length > 0) {
			G.FightStatusUtils.add_unit_status(fight_data, src_unit, target_unit, "毒", 11);
		}
		if (ycsh >= 1 && src_unit["超级吸血"]) {
			G.FightUnitUtils.add_hu_dun_for_lt_hp(fight_data, src_unit, ycsh);
		}
		else {
			if (G.FightUnitUtils.check_fight_unit_jingmai(src_unit, "狮驼岭", "化血") && G.RandomUtils.chance(30)) {
				let xx_damage = Math.floor(damage_result["伤害"] * 0.16)
				if (xx_damage < 1) {
					xx_damage = 1;
				}
				G.FightComputingUtils.add_target_hp_and_play(fight_data, src_unit, xx_damage);
				fight_data["战斗流程"][fight_data["战斗流程"].length - 1]["吸血伤害"] = xx_damage;
				if (src_unit["法术状态"]["毒"] && G.FightUnitUtils.get_error_xx_status(target_unit).length > 0) {
					G.FightStatusUtils.add_unit_status(fight_data, src_unit, target_unit, "毒", 11);
				}
			} else if (src_unit["法术状态"]["狂怒"] && src_unit["法术状态"]["狂怒"]["攫取"] && G.RandomUtils.chance(50)) {
				let xx_damage = Math.floor(damage_result["伤害"] * 0.16)
				if (xx_damage < 1) {
					xx_damage = 1;
				}
				G.FightComputingUtils.add_target_hp_and_play(fight_data, src_unit, xx_damage);
				fight_data["战斗流程"][fight_data["战斗流程"].length - 1]["吸血伤害"] = xx_damage;
				if (src_unit["法术状态"]["毒"] && G.FightUnitUtils.get_error_xx_status(target_unit).length > 0) {
					G.FightStatusUtils.add_unit_status(fight_data, src_unit, target_unit, "毒", 11);
				}
			}
		}
	}

	// 攻击方普通攻击后特殊状态算法
	for (const key in src_unit["特殊状态"]) {
		console.debug(`普攻触发 => 特殊状态 ${key}`);
		if (G.SkillData.default[key] && G.SkillData.default[key]["普攻触发"]) {
			G.SkillData.default[key]["普攻触发"](fight_data, src_unit, target_unit, bh);
		}
	}

	// 被普通攻击后特殊状态算法
	for (const key in target_unit["特殊状态"]) {
		console.debug(`被普攻触发 => 特殊状态 ${key}`);
		if (G.SkillData.default[key] && G.SkillData.default[key]["被普攻触发"]) {
			G.SkillData.default[key]["被普攻触发"](fight_data, src_unit, target_unit, damage_result["伤害"], bh);
		}
	}

	// 被普通攻击后法术状态算法
	for (const key in target_unit["法术状态"]) {
		console.debug(`被普攻触发 => 法术状态 ${key}`);
		if (G.SkillData.default[key] && G.SkillData.default[key]["被普攻触发"]) {
			G.SkillData.default[key]["被普攻触发"](fight_data, src_unit, target_unit, damage_result["伤害"], bh);
		}
	}

	if (src_unit["超强力"] && G.RandomUtils.chance(10)) {
		G.FightStatusUtils.add_unit_status(fight_data, target_unit, target_unit, "超级强力", 100);
	}
	//计算是否触发毒
	if (src_unit["毒"] && G.RandomUtils.chance(src_unit["毒"]) && G.FightSealSkillUtils.get_unit_fengyin_success("毒", src_unit["等级"], src_unit, target_unit)) {
		G.FightStatusUtils.add_unit_status(fight_data, src_unit, target_unit, "毒", src_unit["等级"]);
	}
	fight_data["战斗流程"][fight_data["战斗流程"].length - 1]["被攻击"][0]["伤害"] = damage_result["伤害"];
	fight_data["战斗流程"][fight_data["战斗流程"].length - 1]["被攻击"][0]["伤害类型"] = damage_result["类型"];
	fight_data["战斗流程"][fight_data["战斗流程"].length - 1]["返回"] = true;


	// TODO 苍鸾怒击
	if (final_damage["暴击"] && src_unit["苍鸾怒击"] === 1) {
		src_unit["苍鸾怒击"] = 2;
		let tmp_target = G.FightUtils.get_ry_skill_target(fight_data, src_unit);
		if (tmp_target) {
			src_unit["指令"]["目标"] = tmp_target["编号"];
			computing_normal_attack(fight_data, src_unit, 1.1);
			G.FightStatusUtils.add_unit_status(fight_data, src_unit, src_unit, "苍鸾怒击", 11);
		}
	}

	// TODO 嗜血追击
	if (src_unit["嗜血追击"] === 1 && src_unit["嗜血触发"] === undefined && !G.FightUnitUtils.get_target_unit_status(src_unit, target_unit, 2)) {
		let target = G.FightUtils.get_enemy_team_single_survive_unit(fight_data, src_unit);
		if (target) {
			src_unit["嗜血触发"] = 1;
			src_unit["指令"]["目标"] = target["编号"];
			G.FightNormalAttackUtils.computing_normal_attack(fight_data, src_unit, 0.5);
		}
		if (src_unit["苍鸾怒击"] && src_unit["苍鸾怒击"] === 1) {
			G.FightSkillUtils.clnj(fight_data, src_unit);
		}
	}
	// TODO 乘胜追击
	if (target_unit && src_unit["乘胜追击"] && src_unit["乘胜追击"] >= 4) {
		src_unit["指令"]["参数"] = "乘胜追击";
		G.FightADSkillUtils.computing_ad_skill(fight_data, src_unit, "乘胜追击", 1);
	}

	// 追加法术攻击
	if (!G.FightUnitUtils.check_fight_unit_jingmai(src_unit, "花果山", "逐胜")) {
		G.FightSkillUtils.default["无心插柳"](fight_data, src_unit, target_unit);
		G.FightSkillUtils.default["嗜血幡"](fight_data, src_unit, target_unit);
		if (G.FightUnitUtils.check_fight_unit_passive_skill(src_unit, "披坚执锐") && src_unit["披坚执锐"]) {
			// 披坚执锐追加法术
			G.SkillData.default["披坚执锐"]["被动触发"](fight_data, src_unit, target_unit, false);
		} else {
			// 追加法术伤害
			if (src_unit["嗜血幡"] === undefined && src_unit["追加法术"] > 0
				&& G.RandomUtils.chance(src_unit["套装追加概率"]) && G.FightUnitUtils.get_unit_attack_status(src_unit)) {
				src_unit["指令"]["类型"] = "法术";
				src_unit["指令"]["参数"] = src_unit["追加法术"][0]["名称"];
				// 法术计算
				G.FightAPSkillUtils.computing_ap_skill(fight_data, src_unit, target_unit, src_unit["追加法术"][0]["名称"]);
			}
		}
	}

	// 花果山额外攻击
	if (src_unit["门派"] === "花果山" && !fight_data["PK战斗"]) {
		let new_target_unit = G.FightUtils.get_ry_skill_target(fight_data, src_unit);
		if (new_target_unit) {
			console.debug(`普通攻击计算 ===> 花果山 额外普通攻击一次`);
			src_unit["指令"]["目标"] = new_target_unit["编号"];
			G.FightNormalAttackUtils.computing_normal_attack(fight_data, src_unit, 1);
		}
		if (G.FightUnitUtils.check_fight_unit_jingmai(src_unit, "花果山", "逐胜")) {
			console.debug(`普通攻击计算 ===> 花果山 逐胜 额外普通攻击一次`);
			let new_target_unit = G.FightUtils.get_ry_skill_target(fight_data, src_unit);
			if (new_target_unit) {
				src_unit["指令"]["目标"] = new_target_unit["编号"];
				G.FightNormalAttackUtils.computing_normal_attack(fight_data, src_unit, 1);
			}
		}
	}
	return true;
}